package com.admin.sys.base.websocket.service;

import com.admin.sys.base.websocket.entity.SessionPool;
import com.alibaba.fastjson.JSON;
import org.springframework.stereotype.Component;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * websocket服务器端点
 * @ServerEndpoint 类级别注解，将当前类定义为一个websocket服务端节点，value表示访问路径
 */
@ServerEndpoint(value = "/websocket/{userId}")
@Component
public class WebSocketServer {
    /**
     * 与某个客户端的连接会话，需要通过它来给客户端发送数据
     */
    private Session session;

    /**
     * 连接建立成功需要调用的方法
     *
     * @param session
     * @param userId
     */
    @OnOpen
    public void onOpen(Session session, @PathParam("userId") String userId) {
        // 把会话存入到连接池中
        this.session = session;
        SessionPool.sessionMap.put(userId, session);
    }

    /**
     * 关闭连接
     *
     * @param session
     */
    @OnClose
    public void onClose(Session session) throws IOException {
        SessionPool.close(session.getId());
        session.close();
    }

    /**
     * 收到客户端消息后调用的方法
     * @param message
     * @param session
     */
    @OnMessage
    public void onMessage(String message,Session session){
        Map<String,Object> params = JSON.parseObject(message,new HashMap<String,Object>().getClass());
        SessionPool.sendMessage(params);
    }

}